/**
 * 包括学生端的通用接口调用，app-api开头
 */
import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import Cookies from 'js-cookie'
import { getPath, getTenantEnable } from '@/utils/ruoyi'

// 是否显示重新登录
export const isRelogin = { show: false }
// axios中请求配置有baseURL选项，表示请求URL公共部分

if (process.env.NODE_ENV === 'local') {
  /**
   * local环境是为了方便后端本地调试的，前端应该使用yarn dev
   * local走端口号，直接访问测试服务器
   * dev走80端口，走服务器的ngnix代理，接口请求要使用app-api-test
   */
  axios.defaults.baseURL = 'app-api/'
} else if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = process.env.VUE_APP_BASE_API + 'app-api-test/'
} else {
  axios.defaults.baseURL = process.env.VUE_APP_BASE_API + 'app-api/'
}
// 此处的 app-api/ 地址，原因是后端通用类接口的基础路径为 /app-api/
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  // 超时
  timeout: 10000
})
// request拦截器
service.interceptors.request.use(
  (config) => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false
    if (getToken() && !isToken) {
      config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    const noNeedAuthInfoApi = ['/member/auth/send-sms-graphical-code']
    const hasApi = noNeedAuthInfoApi.some((item) => {
      return config.url.indexOf(item) > -1
    })
    if (hasApi) {
      delete config.headers.Authorization
    }
    // 设置租户  &  部分接口请求不带租户id
    if (getTenantEnable()) {
      const tenantId = Cookies.get('tenantId')
      if (tenantId) {
        config.headers['tenant-id'] = tenantId
      }
    }
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
      let url = config.url + '?'
      for (const propName of Object.keys(config.params)) {
        const value = config.params[propName]
        var part = encodeURIComponent(propName) + '='
        if (value !== null && typeof value !== 'undefined') {
          if (typeof value === 'object') {
            for (const key of Object.keys(value)) {
              const params = propName + '[' + key + ']'
              var subPart = encodeURIComponent(params) + '='
              url += subPart + encodeURIComponent(value[key]) + '&'
            }
          } else {
            url += part + encodeURIComponent(value) + '&'
          }
        }
      }
      url = url.slice(0, -1)
      config.params = {}
      config.url = url
    }
    return config
  },
  (error) => {
    console.log(error)
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    // 未设置状态码则默认成功状态
    const code = res.data?.code || 200
    // 获取错误信息
    let msg = errorCode[code] || res.data.msg || errorCode['default']
    if (code === 1002003009 && msg === '用户正在更换手机号') {
      msg = '该账号处于手机号变更审核中，禁止登录'
    }
    if (code === 401 || code === 4002 || code === 1004001000) {
      if (!isRelogin.show) {
        isRelogin.show = true
        MessageBox.confirm(
          '登录状态已过期，您可以继续留在该页面，或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        )
          .then(() => {
            isRelogin.show = false
            store.dispatch('LogOut').then(() => {
              const loginType = localStorage.getItem('loginType') || 'company'
              if (loginType === 'admin') {
                location.href = getPath('/#/adminLogin')
              } else {
                location.href = getPath('/#/login')
              }
            })
          })
          .catch(() => {
            isRelogin.show = false
          })
      }
      return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
    } else if (code === 500) {
      Message({
        message: msg,
        type: 'error'
      })
      return Promise.reject(new Error(msg))
    } else if (code === 901) {
      Message({
        type: 'error',
        duration: 0,
        dangerouslyUseHTMLString: true,
        message:
          '<div>演示模式，无法进行写操作</div>' +
          '<div> &nbsp; </div>' +
          '<div>参考 https://doc.iocoder.cn/ 教程</div>' +
          '<div> &nbsp; </div>' +
          '<div>5 分钟搭建本地环境</div>'
      })
      return Promise.reject(new Error(msg))
    } else if (code !== 200) {
      Notification.error({
        title: msg
      })
      return Promise.reject('error')
    } else {
      return res.data
    }
  },
  (error) => {
    console.log('err' + error)
    let { message } = error
    if (message === 'Network Error') {
      message = '后端接口连接异常'
    } else if (message.includes('timeout')) {
      message = '系统接口请求超时'
    } else if (message.includes('Request failed with status code')) {
      message = '系统接口' + message.substr(message.length - 3) + '异常'
    }
    Message({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export function getBaseHeader() {
  return {
    Authorization: 'Bearer ' + getToken(),
    'tenant-id': Cookies.get('tenantId')
  }
}

export default service
